using System;
using System.Collections;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using Iesi.Collections.Generic;
using METODESA.Server.Data.Exceptions;
using METODESA.Server.Data.METODESA.Entity;
using METODESA.Server.Data.METODESA.Factorys;
using METODESA.Server.Data.METODESA.Nhibernate;
using NHibernate;

namespace Metodesa.Logic
{
    public class CompraLogic
    {

        public static IList<OrdenCompra> processSearch(string search, string type, string criteria)
        {
            if(criteria=="" || search=="")
            {
                return CompraDao.getAllCompras(type);
            }
            else
            {
                 
                switch (criteria)
                {
                    case "Codigo":return CompraDao.getCompraByCodigo(search,type);

                    case "Fecha": return CompraDao.getCompraByFecha(search, type);

                    case "Empleado": return CompraDao.getCompraByEmpleado(search, type);

                    case "Proveedor": return CompraDao.getCompraByProveedor(search, type);
                       
                }
                
            }
            
            return null;
        }

        public static void add(string fecha, string empleadoId, string proveedorId)
        {
           
            try
            {
               
                OrdenCompra compra = FactoryCompra.getCompra();
                compra.Empleado = EmpleadoDao.getEmpleadoById(int.Parse(empleadoId));
                compra.Proveedor = ProveedorDao.getProveedorById(int.Parse(proveedorId));
                compra.Fecha = fecha;
                compra.detalleCompra = null;
                CompraDao.saveEntity(compra);
                
            }
            catch (HibernateException e)
            {
               
                NHibernateHelper.GetCurrentSession().Clear(); // Quitamos el query que nos dio error
                throw new EntityCouldntBeSaved("La compra no se ha podido agregar " + e.Message);
            }
            
        }

        public static DetalleCompra AddDetalleCompra(int idProducto, string idCompra, string cantidad, out double monto)
        {
            try
            {
                DetalleCompra detalle = FactoryDetalleCompra.getDetalleCompra();
                detalle.Cantidad = int.Parse(cantidad);
                detalle.Producto = ProductoDao.getProductoById(idProducto);
                detalle.Precio = detalle.Producto.Precio;
                OrdenCompra compra = CompraDao.getCompraById(int.Parse(idCompra));
                if (compra.detalleCompra == null)
                    compra.detalleCompra = new HashedSet<DetalleCompra>();
                compra.detalleCompra.Add(detalle);
                detalle.OrdenCompra = compra;
                compra.Monto = compra.Monto + (detalle.Cantidad*detalle.Precio);
                monto = compra.Monto;
                CompraDao.updateEntity(compra,detalle);
                return detalle;
            }
            catch (HibernateException e)
            {

                NHibernateHelper.GetCurrentSession().Clear(); // Quitamos el query que nos dio error
                throw new EntityCouldntBeSaved("El detalle no se ha podido agregar " + e.Message);
               
            }
           
           
        }

        public static OrdenCompra Close(string value)
        {
            ITransaction myTransaction = null;
            try
            {
                myTransaction = NHibernateHelper.GetCurrentSession().BeginTransaction();
                OrdenCompra compra = CompraDao.getCompraById(int.Parse(value));
                compra.Estado = 1;
                CompraDao.updateSimple(compra);
                myTransaction.Commit();
                return compra;
                
            }
            catch (HibernateException e)
            {
                if (myTransaction != null) 
                    myTransaction.Rollback();
                NHibernateHelper.GetCurrentSession().Clear();
                throw new EntityCouldntBeSaved("El detalle no se ha podido agregar " + e.Message);
               
            }

        }

        public static void deleteDetalle(int idCompra,int idDetalle)
        {
            ITransaction myTransaction = null;
            
            try
            {
                NHibernateHelper.GetCurrentSession().Clear();
               OrdenCompra compra= CompraDao.getCompraById(idCompra);
                DetalleCompra detalleCompra = DetalleCompraDao.getDetalleById(idDetalle);
              myTransaction = NHibernateHelper.GetCurrentSession().BeginTransaction();
              compra.Monto = compra.Monto - detalleCompra.Precio*detalleCompra.Cantidad;
                
              compra.detalleCompra.Remove(detalleCompra);

              CompraDao.updateSimple(compra);
              
              myTransaction.Commit();
            }
            catch (HibernateException)
            {
                if(myTransaction!=null)
                    myTransaction.Rollback();
                NHibernateHelper.GetCurrentSession().Clear();
                throw new EntityCouldntBeUpdated("No se pudo cerrar la compra");
              
            }
        }

        public static void reCalculatePrices(string compraId)
        {
            ITransaction myTransaction = null;
            try
            {
                myTransaction = NHibernateHelper.GetCurrentSession().BeginTransaction();
                OrdenCompra compra = CompraDao.getCompraById(int.Parse(compraId));
                if(compra.Estado==1)
                    return; // Si el estado es 1 la comrpa esta cerrada no se tiene q calcular
                compra.Monto = 0;
                foreach (DetalleCompra detalle in compra.detalleCompra)
                {
                    detalle.Precio = detalle.Producto.Precio;
                    compra.Monto = compra.Monto + detalle.Cantidad*detalle.Precio;
                }

                CompraDao.updateSimple(compra);
                myTransaction.Commit();
                
            }
            catch
            {
                if (myTransaction != null) 
                    myTransaction.Rollback();
                NHibernateHelper.GetCurrentSession().Clear();
            }
        }

        public static void edit(int id,string fecha, string empleadoId, string proveedorId)
        {
            ITransaction myTransaction = null;

            try
            {
                myTransaction = NHibernateHelper.GetCurrentSession().BeginTransaction();
                OrdenCompra compra = CompraDao.getCompraById(id);
                Empleado empleadoViejo = compra.Empleado;
                empleadoViejo.ordenCompra.Remove(compra);
                compra.Empleado = EmpleadoDao.getEmpleadoById(int.Parse(empleadoId));
                compra.Proveedor = ProveedorDao.getProveedorById(int.Parse(proveedorId));
                compra.Fecha = fecha;
                CompraDao.updateSimple(compra);
                EmpleadoDao.updateSimple(empleadoViejo);
                myTransaction.Commit();
                

            }
            catch (HibernateException e)
            {
                myTransaction.Rollback();
                NHibernateHelper.GetCurrentSession().Clear(); // Quitamos el query que nos dio error
                throw new EntityCouldntBeUpdated("La compra no se ha podido modificar " + e.Message);
            }
        }
    }
}